package com.tedu.project5.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tedu.project5.common.Result;
import com.tedu.project5.dto.QueryUserDTO;
import com.tedu.project5.dto.RegisterDto;
import com.tedu.project5.dto.UserDTO;
import com.tedu.project5.model.DdPermission;
import com.tedu.project5.model.DdRole;
import com.tedu.project5.model.DdUser;
import com.tedu.project5.mapper.DdUserMapper;
import com.tedu.project5.service.IDdUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * <p>
 *  用户服务实现类
 * </p>
 *
 * @author mhg
 * @since 2022-06-13
 */
@Slf4j
@Service
public class DdUserServiceImpl extends ServiceImpl<DdUserMapper, DdUser> implements IDdUserService,UserDetailsService {

    //用户表的持久层
    @Autowired(required = false)
    private DdUserMapper ddUserMapper;

    //密码加密器
    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * 登录的处理逻辑
     * @param username  这个是页面上用户名输入框的名字
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        log.info("用户名为--：" + username);
        // 1.根据用户名查询用户对象
        DdUser user = ddUserMapper.findUserByUserName(username);
        // 2.判断是否能够查询到用户,没有该用户表示用户名不存在
        log.info("用户信息为--：" + user.toString());
        if (user == null) {
            return null;
        }
        // 3.根据用户id查询用户的所有权限
        List<DdPermission> permissions = ddUserMapper
                .findUserPermissionsById(user.getId());
        // 4.将权限的集合转换为String类型数组,并赋值
        String[] auth = new String[permissions.size()];
        int i = 0;
        log.info("权限集合--："+ permissions.toString());
        for (DdPermission p : permissions) {
            auth[i] = p.getPermissionname();
            i++;
        }
        // 查询当前用户所有角色
        List<DdRole> roles = ddUserMapper.findUserRolesById(
                user.getId());
        // 数组扩容
        auth = Arrays.copyOf(auth,
                auth.length + roles.size());
        //  {"/getid","/add","/update","/upload",null}
        for (DdRole role : roles) {
            auth[i++] = role.getRolename();
        }
        // 5.构建UserDetails对象
        UserDetails details = org.springframework.security
                .core.userdetails.User.builder()
                .username(user.getUsername())
                .password(user.getPassword())
                .authorities(auth)
                .build();
        // 6.返回UserDetails对象
        log.info("用户信息详情--:" + details);
        return details;
    }

    /**
     * 注册
     * @param dto
     * @return
     */
    @Override
    public Result register(RegisterDto dto) {
        //1、先判断传过来的用户名密码不为空（数据的合法性校验）,检验用户名没有被注册过
        //2、检验失败则返回失败  return Result.error();
        DdUser user = new DdUser();
        user.setUsername(dto.getUsername());
        user.setPassword(passwordEncoder.encode(dto.getPassword()));
        user.setAge(dto.getAge());
        user.setNickname(dto.getNickname());
        user.setAddress(dto.getAddress());
        user.setDescription(dto.getDescription());
        ddUserMapper.insert(user);
        return Result.ok();
    }

    /**
     * 更新员工信息
     * @param dto
     * @return
     */
    @Override
    public Result updateUser(UserDTO dto) {
        //校验数据合法性
        if (dto!=null && dto.getId()!=null && dto.getNickname()!=null && dto.getAge()!=null && dto.getAddress()!=null && dto.getDescription()!=null){
            //组装数据
            DdUser pojo = new DdUser();
            pojo.setId(dto.getId());
            pojo.setNickname(dto.getNickname());
            pojo.setAge(dto.getAge());
            pojo.setAddress(dto.getAddress());
            pojo.setDescription(dto.getDescription());
            //保存到数据库
            int i = ddUserMapper.updateById(pojo);
            if (i!=0){
                return Result.ok();
            }else{
                return Result.error("更新失败");
            }

        }else{
            return Result.error("数据不合法！");
        }
    }

    /**
     * 删除员工信息
     * @param id
     * @return
     */
    @Override
    public Result deleteUser(String id) {
        int i = ddUserMapper.deleteById(id);
        if (i>=0){
            return Result.ok();
        }else{
            return Result.error("删除失败");
        }
    }

    /**
     * 查询员工列表
     * @param dto
     * @return
     */
    @Override
    public Result queryExample(QueryUserDTO dto) {
        QueryWrapper<DdUser> wrapper = new QueryWrapper<>();
        //查询条件
        if (dto.getUsername()!=null){
            //第一个参数是表里的字段名，第二个参数是前端传过来的值
            wrapper.like("username",dto.getUsername());   //where username like '%788%'
        }
        if (dto.getNickname()!=null){
            //第一个参数是表里的字段名，第二个参数是前端传过来的值
            wrapper.like("nickname",dto.getNickname());  //where nickname like '%滕%'
        }
        if (dto.getAddress()!=null){
            //第一个参数是表里的字段名，第二个参数是前端传过来的值
            wrapper.like("address",dto.getAddress());
        }
        if (dto.getDescription()!=null){
            //第一个参数是表里的字段名，第二个参数是前端传过来的值
            wrapper.like("description",dto.getDescription());
        }
        List<DdUser> ddUsers = ddUserMapper.selectList(wrapper);
        return Result.ok(ddUsers);
    }

    /**
     * 新增员工
     * @param user
     * @return
     */
    @Override
    public Result saveUser(DdUser user) {
        if (user.getUsername()!=null && user.getNickname()!=null && user.getPassword()!=null && user.getAge()!=null
                && user.getAddress()!=null && user.getDescription()!=null ){
            //加密密码
            user.setPassword(passwordEncoder.encode(user.getPassword()));
            int insert = ddUserMapper.insert(user);
            if (insert>=0){
                return Result.ok();
            }else{
                return Result.error("插入失败");
            }
        }else{
            return Result.error("参数缺失");
        }
    }
}
